﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TSU.FAMC.ComputerEngineering.Classes.BooleanMaths.Functions;
using TSU.FAMC.ComputerEngineering.Classes.BooleanMaths.Functions.Readers;
using TSU.FAMC.ComputerEngineering.Classes.BooleanMaths.Functions.Writers;

namespace SystemFDFormatRecovery
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() != DialogResult.OK)
            {
                return;
            }

            if (openFileDialog1.FileNames.Length == 0)
            {
                MessageBox.Show("Не выбрано ни одного файла системы для построения тестов!");
                return;
            }


            // reading files
            reportBox.Clear();
            var errorsCounter = 0;
            var successFiles = new List<String>();
            var sucessSystems = new List<BooleanSystem>();
            foreach (var fileName in openFileDialog1.FileNames)
            {
                var fileStr = String.Empty;

                try
                {
                    // reading file
                    var streamReader = new StreamReader(fileName);
                    fileStr = streamReader.ReadToEnd();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}.\r\n Ошибка: не удалось прочитать файл. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }

                // reading system

                var system = new BooleanSystem();

                var reader = new BooleanSystemReaderPlafd();
                reader.Input = fileStr;
                reader.System = system;

                try
                {
                    reader.Read();
                }
                catch (Exception ex)
                {
                    reportBox.Text += string.Format("{0}.\r\n Ошибка: не удалось прочитать систему. Подрбнее: {1} \r\n\r\n", fileName, ex.Message);
                    errorsCounter++;
                    continue;
                }
                
                // saving success system
                sucessSystems.Add(system);

                // saving success file name
                successFiles.Add(fileName);

                reportBox.Text += string.Format("{0}.\r\n Успех: система успешно прочитана. \r\n\r\n", fileName);
            }

            
            // showing select output folder dialog
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK &&
                folderBrowserDialog1.SelectedPath != String.Empty)
            {
                // output folder selected

                // printing systems to files with headers
                var writer = new BooleanSystemWriterPlafd();
                for (var i = 0; i < successFiles.Count; i++)
                {
                    writer.System = sucessSystems[i];
                    writer.Write();

                    var outputStr = writer.Output;

                    // writing file
                    var fileName = Path.GetFileName(successFiles[i]);
                    var outputFilePath = folderBrowserDialog1.SelectedPath + Path.DirectorySeparatorChar + fileName;

                    try
                    {
                        var streamWriter = new StreamWriter(outputFilePath);
                        streamWriter.Write(outputStr);
                        streamWriter.Close();
                    }
                    catch (Exception ex)
                    {
                        reportBox.Text +=
                            string.Format("{0}. Ошибка: не удалось записать в файл. Подрбнее: {1} \r\n\r\n",
                                          fileName, ex.Message);
                        continue;
                    }
                }
            }


            if (errorsCounter == 0)
            {
                MessageBox.Show("Обработка систем завершена успешно!");
            }
            else
            {
                MessageBox.Show(string.Format("Во время обработки систем возникло {0} ошибок", errorsCounter));
            }
        }
    }
}
